// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

// 防止头文件重复包含的预处理指令

#include "Engine/DataAsset.h"
#include "GameplayTagContainer.h"

// 包含所需的头文件：
// - DataAsset: 数据资产基类
// - GameplayTagContainer: 游戏标签容器

#include "LyraInputConfig.generated.h"

// 包含UE的代码生成头文件

class UInputAction;
class UObject;
struct FFrame;

// 前向声明类

/**
 * FLyraInputAction
 *
 *	用于将输入动作映射到游戏输入标签的结构体
 */
USTRUCT(BlueprintType)  // 标记为可在蓝图中使用的结构体
struct FLyraInputAction
{
	GENERATED_BODY()  // UE宏，生成结构体必要的样板代码

public:

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)  // 仅在编辑器中可编辑，在蓝图中只读
	TObjectPtr<const UInputAction> InputAction = nullptr;  // 输入动作引用

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta = (Categories = "InputTag"))  // 元数据指定标签类别
	FGameplayTag InputTag;  // 游戏标签，用于标识输入类型
};

/**
 * ULyraInputConfig
 *
 *	不可变的数据资产，包含输入配置属性
 */
UCLASS(BlueprintType, Const)  // 标记为可在蓝图中使用的常量类
class ULyraInputConfig : public UDataAsset  // 继承自数据资产
{
	GENERATED_BODY()  // UE宏，生成类必要的样板代码

public:

	ULyraInputConfig(const FObjectInitializer& ObjectInitializer);

	// 根据标签查找原生输入动作
	UFUNCTION(BlueprintCallable, Category = "Lyra|Pawn")  // 蓝图可调用函数，分类为Lyra|Pawn
	const UInputAction* FindNativeInputActionForTag(const FGameplayTag& InputTag, bool bLogNotFound = true) const;

	// 根据标签查找技能输入动作
	UFUNCTION(BlueprintCallable, Category = "Lyra|Pawn")
	const UInputAction* FindAbilityInputActionForTag(const FGameplayTag& InputTag, bool bLogNotFound = true) const;

public:
	// 所有者使用的输入动作列表。这些输入动作映射到游戏标签，必须手动绑定。
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta = (TitleProperty = "InputAction"))  // TitleProperty指定在编辑器中显示哪个属性
	TArray<FLyraInputAction> NativeInputActions;  // 原生输入动作数组

	// 所有者使用的输入动作列表。这些输入动作映射到游戏标签，会自动绑定到具有匹配输入标签的技能。
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta = (TitleProperty = "InputAction"))
	TArray<FLyraInputAction> AbilityInputActions;  // 技能输入动作数组
};